package persistencia.xml;

import java.beans.PersistenceDelegate;
import java.io.File;
import java.util.HashMap;
import java.util.Map;

import compartido.IEntidad;

import persistencia.IAlmacen;
import persistencia.IEnsamblador;
import persistencia.IGondola;
import persistencia.IIngrediente;
import persistencia.IProducto;
import persistencia.compartido.Tipo;
import persistencia.excepciones.StringDeConexionIncompatible;

public class AlmacenXML implements IAlmacen {

	protected Map<String,GondolaXML> gondolas;
	protected File directorio;

	public AlmacenXML() {
		gondolas = new HashMap<String, GondolaXML>();
	}
	
	@Override
	public boolean esValido(String StringDeConexion) {
		return (StringDeConexion.matches("[^:]*") || StringDeConexion.matches("xml+:.+"));
	}
	
	@Override
	public boolean estaConectado() {
		return (directorio != null);
	}
	
	protected String armarNombreArchivo(File directorio, String nombre) {
		return directorio.getAbsolutePath()+"/"+nombre+".xml";
	}

	@Override
	public void abrir(String StringDeConexion) throws StringDeConexionIncompatible {
		if (!estaConectado()) {
			File directorio = null;
			if (StringDeConexion.matches("[^:]*")) {
				directorio = new File(StringDeConexion);
			} else if (StringDeConexion.matches(".*:.*")) {
				String[] partes = StringDeConexion.split(":");
				if ((partes.length == 2) && (partes[0].compareTo("xml")==0))
					directorio = new File(partes[1]);
			}
			
			if ((directorio==null) || (!directorio.isDirectory()))
				throw new StringDeConexionIncompatible();

			this.directorio = directorio;
		}
		
	}

	@Override
	public void cerrar() {
		gondolas.clear();
		directorio = null;
	}

	@Override
	public IGondola crearGondola(Tipo<IEntidad> tipo) {
		GondolaXML creada = gondolas.get(tipo.getNombre());
		
		if (creada == null) {
			creada = new GondolaXML(directorio.getAbsolutePath()+"/"+tipo.getNombre()+".xml");
			gondolas.put(tipo.getNombre(),creada);
		}		
		return creada;
	}

	@Override
	public IIngrediente crearIngrediente(String nombre, String valor) {
		return null;
	}

	@Override
	public IProducto crearProducto(String campoID, String nombre, Tipo<IEntidad> tipo) {
		return null;
	}

	@Override
	public void guardar() {
		for (GondolaXML gondola : gondolas.values()) {
			if (gondola.estaSucia())
				gondola.guardar();
		}
	}

	@Override
	public IGondola obtenerGondola(Tipo<IEntidad> tipo) {
		GondolaXML existente = gondolas.get(tipo.getNombre());
		if (existente == null) {
			String nombreArchivo = directorio.getAbsolutePath()+"/"+tipo.getNombre()+".xml"; 
			File archivo = new File(nombreArchivo);
			if (archivo.exists()) {
				existente = new GondolaXML(archivo.getAbsolutePath());
				gondolas.put(tipo.getNombre(),existente);
			}
		}
		return existente;
	}		

	@Override
	public void registrarEnsamblador(Tipo<IEntidad> entidades, IEnsamblador delegado) {
		if (delegado instanceof EnsambladorXML) {
			EnsambladorXML ensamblador = (EnsambladorXML)delegado;
			registrarDelegado(entidades, ensamblador.getPersistenceDelegate());
		}
	}
	
	public void registrarDelegado(Tipo<IEntidad> entidades, PersistenceDelegate delegado) {
		CodificadorXML codificador = CodificadorXML.getInstancia();
		codificador.registrarDelegado(entidades.getClase(), delegado);
	}

}
